<?php

/*
 * Автозагрузка классов и интерфейсов фреймворка T4
 */

namespace T4;

$autoload = function ($class) {

	    $parts = explode('\\', $class);
	    
	    /**
	     * Отдельные части имен, которые нужно привести к верхнему регистру
	     */
	    /*
	    foreach ( $parts as &$part ) {
		preg_replace('/(adapter|element)/e', 'ucfirst(\'$1\')', $part);
	    }
	    */
	    
	    switch (true) {

		/**
		 * Системные классы фреймворка
		 */
		case
		count($parts) == 2 && ( 'T4' == $parts[0] ):

		    // Сначала ищем в корне /сlasses
		    if (file_exists(ROOT_PATH . '/classes/' . $parts[1] . '.php')) {

			require ROOT_PATH . '/classes/' . $parts[1] . '.php';

			// Если там нет - в соответствующем пакете
		    } else {

			require ROOT_PATH . '/classes/' . strtolower($parts[1]) . '/' . $parts[1] . '.php';
		    }

		    break;

		/**
		 * Системные классы фреймворка в подпространствах
		 */
		case
		count($parts) == 3 && ( 'T4' == $parts[0] ):
		    require ROOT_PATH . '/classes/' . strtolower($parts[1]) . '/' . $parts[2] . '.php';
		    break;
		case
		count($parts) == 4 && ( 'T4' == $parts[0] ):
		    require ROOT_PATH . '/classes/' . strtolower($parts[1]) . '/' . strtolower($parts[2]) . '/' . $parts[3] . '.php';
		    break;
		case
		count($parts) == 5 && ( 'T4' == $parts[0] ):
		    require ROOT_PATH . '/classes/' . strtolower($parts[1]) . '/' . strtolower($parts[2]) . '/' . strtolower($parts[3]) . '/' . $parts[4] . '.php';
		    break;

		/**
		 * Основные классы приложений
		 */
		case
		count($parts) == 2 && ( 'APPS' == $parts[0] ):
		    require \ROOT_PATH . '/' . Application::DIR . '/' . $parts[1] . '/application.php';
		    break;

		/**
		 * Контроллеры, модели и прочие части приложений
		 */
		case
		count($parts) == 4 && ( 'APPS' == $parts[0] ):
		    require \ROOT_PATH . '/' . Application::DIR . '/' . strtolower($parts[1]) . '/' . strtolower($parts[2]) . '/' . $parts[3] . '.php';
		    break;
		
		/**
		 * "Подконтроллеры"
		 */
		case
		count($parts) == 5 && ( 'APPS' == $parts[0] ):
		    require \ROOT_PATH . '/' . Application::DIR . '/' . strtolower($parts[1]) . '/' . strtolower($parts[2]) . '/' . strtolower($parts[3]) . '/' . $parts[4] . '.php';
		    break;

		/**
		 * Основные классы тем
		 */
		case
		count($parts) == 2 && ( 'THEMES' == $parts[0] ):
		    require \ROOT_PATH . '/themes/' . strtolower($parts[1]) . '/theme.php';
		    break;

		default:
		    return false;
		    
	    }
	    
	};

spl_autoload_register($autoload);

/**
 * Проходим по библиотекам фреймворка
 */
$dir = dir(ROOT_PATH . '/libs');

while (false !== ($entry = $dir->read())) {

    if ('.' == substr($entry, 0, 1)) {
	continue;
    };

    $filename = ROOT_PATH . '/libs/' . $entry . '/autoload.php';

    if (file_exists($filename)) {
	require $filename;
    }
    
};

$dir->close();